var str = "123"; //String
var num = 123; //number
var arry = [1, 2, 3]; //Arry
var bool = true; //Boolean;
var obj = {
  num: 123,
}; //Object
var und = undefined; //undefined
var nu = null; //null
var fn = function () {}; //function
var sy = Symbol("sy"); //symbol

/* 通过 typeof 去判断类型 */
console.log("-----------");
console.log("通过typeof来判断类型");
console.log("变量str的数据类型：" + typeof str); //string
console.log("变量num的数据类型：" + typeof num); //number
console.log("变量arry的数据类型：" + typeof arry); //object
console.log("变量bool的数据类型：" + typeof bool); //boolean
console.log("变量obj的数据类型：" + typeof obj); //object
console.log("变量und的数据类型：" + typeof und); //undefind
console.log("变量nu的数据类型：" + typeof nu); //object
console.log("变量fn的数据类型：" + typeof fn); //function
console.log("变量sy的数据类型：" + typeof sy); //function
/* 
    总结：typeof 只能鉴别出基本数据类型：string number boolean undefined symbol
                null（存储方式导致为object）和引用数据类型都为 object
                变量存储
                000：对象    null：机器码全0 
                010：浮点数  undefined -2^30
                100：字符串
                110：布尔
                1：整数
                可以鉴别出 function

 */

/* 通过instanceof */
/*
  是只要右边变量的 prototype 在左边变量的原型链上即可。
  因此，instanceof 在查找的过程中会遍历左边变量的原型链，
  直到找到右边变量的 prototype，如果查找失败，则会返回 false，
  告诉我们左边变量并非是右边变量的实例。  
*/
console.log("变量arry的数据类型是Arry吗：" + (arry instanceof Array)); //true
console.log("变量arry的数据类型是Object吗：" + (arry instanceof Object)); //true

/* 通过Object.prototype.toString.call */
//最佳方式可以准确判断每个变量类型
// Object.prototype.toString.call
console.log("-----------");
console.log("通过通过Object.prototype.toString.call来判断类型");
console.log("变量str的数据类型：" + Object.prototype.toString.call(str));
console.log("变量num的数据类型：" + Object.prototype.toString.call(num));
console.log("变量arry的数据类型：" + Object.prototype.toString.call(arry));
console.log("变量bool的数据类型：" + Object.prototype.toString.call(bool));
console.log("变量obj的数据类型：" + Object.prototype.toString.call(obj));
console.log("变量und的数据类型：" + Object.prototype.toString.call(und));
console.log("变量nu的数据类型：" + Object.prototype.toString.call(nu));
console.log("变量fn的数据类型：" + Object.prototype.toString.call(fn));
console.log("变量sy的数据类型：" + Object.prototype.toString.call(sy));
